package Persistance;

import java.io.FileInputStream;
import java.sql.*;
import java.util.*;

public class PoolConnection 
{
	private static PoolConnection sharedInstance;
	private ArrayList<Connection> conexionesLibres;
	private ArrayList<Connection> conexionesOcupadas;
	
	private int cantCon;
	private String jdbc;
	private String servidor;
	private String usuario;
	private String password;
	
	private PoolConnection()
	{
		conexionesLibres = new ArrayList<Connection>();
		conexionesOcupadas = new ArrayList<Connection>();
		
		this.getConfiguration();
		
		for(int i = 0; i < cantCon; i++)
		{
			Connection conn = this.connect();
			
			if(conn != null)
				conexionesLibres.add(this.connect());
		}
	}

	
	public static PoolConnection getPoolConnection()
	{
		if (sharedInstance == null)
			sharedInstance = new PoolConnection();
		
		return sharedInstance;
	}

	private Connection connect()
	{
		Connection con = null;
		
        try 
        {
        	jdbc = "jdbc:sqlserver://";
        	servidor = "127.0.0.1:3515";
        	usuario = "AI2011G09";
        	password = "AI2011G09";
        	
        	Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
            con = DriverManager.getConnection (jdbc + servidor, usuario, password);
        } 
        catch (SQLException ex) 
        {
            System.out.println(ex.getMessage());
        } 
        catch (ClassNotFoundException ex) 
        {
            System.out.println(ex.getMessage());
        }
        
		return con;
	}
	
	public Connection getConnection()
	{
		Connection con = null;
		
		if (conexionesLibres.size() > 0)
		{
			con = conexionesLibres.remove(0);
			conexionesOcupadas.add(con);
		}
		
		return con;
	}

	public void realeaseConnection(Connection conn)
	{
		if (conn != null && conexionesOcupadas.contains(conn))
		{
			conexionesOcupadas.remove(conn);
			conexionesLibres.add(conn);
		}
	}
	
	public void closeConnections()
	{
		for (int i=0; i<conexionesLibres.size();i++)
		{
			try
			{
				conexionesLibres.get(i).close();
			}
			catch(Exception e){}
		}
		
		for (int i=0; i<conexionesOcupadas.size();i++)
		{
			try
			{
				conexionesOcupadas.get(i).close();
			}
			catch(Exception e){}
		}
	}

	private void getConfiguration()
	{
		String configuracion = "resources/ConfigBD.txt";
	    Properties propiedades;
	 
	    // Carga del fichero de propiedades 
	    try 
	    {
	       FileInputStream f = new FileInputStream(configuracion);	 
	       propiedades = new Properties();
	       propiedades.load(f);
	       f.close();
	 
	       // Leo los valores de configuracion
	       jdbc = propiedades.getProperty("jdbc"); 
	       servidor = propiedades.getProperty("servidor");
	       usuario = propiedades.getProperty("usuario");
	       password = propiedades.getProperty("password");
	       cantCon = Integer.parseInt(propiedades.getProperty("conexiones"));
	     } 
	    catch (Exception e) 
	     {
				System.out.println("Mensaje Error: " + e.getMessage());
				System.out.println("Stack Trace: " + e.getStackTrace());
	     }
	}
}
